package cn.jsj.onclock.service;

import cn.jsj.onclock.aop.PageNum;
import cn.jsj.onclock.aop.PageSize;
import cn.jsj.onclock.aop.PrimaryKeyParam;
import cn.jsj.onclock.pojo.UserJoinRequest;
import cn.jsj.onclock.pojo.identity.ApproveResultEnum;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @author 卢斌
 */
@Validated
public interface UserJoinRequestService {

    /**
     * 用户提交个人加群申请
     *
     * @param userId    用户Id
     * @param groupId   目标群组
     * @param message   申请信息
     * @param leaveName 申请者留名
     * @return 提交加群申请后的状态（被拒绝，已加入，等待审核）
     */
    ApproveResultEnum submitUserJoinGroupRequest(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long groupId, @NotBlank @Length(max = 500) String message, @Length(max = 40) String leaveName);


    /**
     * 用户获取和自己相关的群组申请记录
     *
     * @param userId    用户Id
     * @param result    申请结果
     * @param pageNum   页码号
     * @param pageSize  页容量
     * @return  用户相关的申请记录
     */
    List<UserJoinRequest> listUserJoinRequest(@PrimaryKeyParam Long userId, ApproveResultEnum result, @PageNum Integer pageNum, @PageSize Integer pageSize);


    /**
     * 获取群组收到的加群申请信息
     *
     * @param userId    用户Id
     * @param groupId   群组Id
     * @param result    审批状态
     * @param pageNum   页码号
     * @param pageSize  页容量
     * @return 群组收到的加群申请
     */
    List<UserJoinRequest> listGroupReceivedUserJoinRequest(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long groupId, ApproveResultEnum result, @PageNum Integer pageNum, @PageSize Integer pageSize);


    /**
     * 群相关负责人审批普通用户提交的加群申请信息
     *
     * @param userId                审批者Id
     * @param userJoinRequestId     即将审批的用户申请
     * @param result                审批结果
     * @return  用户审批的结果
     */
    ApproveResultEnum judgeGroupRequest(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long userJoinRequestId, @NotNull ApproveResultEnum result);


    /**
     * 获取群内具有审批其他用户加群申请权限的用户Id
     *
     * @param groupId   群组Id
     * @return  群内具有加群审批权限的用户Id列表
     */
    List<Long> listUserIdCouldCheckGroupJoinRequestInOneGroup(@PrimaryKeyParam Long groupId);


}
